//! Upravljanje prekidima - niska razina

#ifndef	_ARH_PREKIDI_H_
#define	_ARH_PREKIDI_H_

#ifndef _ARH_PREKIDI_S_
#include "tipovi.h"
#endif	/* !_ARH_PREKIDI_S_ */

//!prikazano i izvan prekidi.cS ----------------------------------------------->

//dozvoljeni broj razlicitih prekida
#define	PREKIDI_BROJ		49	//49 je dosta iako moze i do 256

//gdje su koji prekidi
#define	PREKIDI_PROCESOR	0
#define	PREKIDI_VANJSKI		32
#define	PREKIDI_PROGRAMSKI	48

#ifndef _ARH_PREKIDI_S_

void arh_prekidi_inicijaliziraj (	void (*j_prekidnaf)(int),
					uint32 *jstogpr,
					uint32 ***stog_aktivne);

char *arh_opis_prekida (int n);

#endif	/* !_ARH_PREKIDI_S_ */

#define	PREKIDI_SAT		32	//tu se javlja prekid sata (PIT-a)
#define	PREKIDI_TIPKOVNICA	33	//tu se javlja prekid sata tipkovnice

//i8259 (PIC) ----------------------------------------------------------------->
#define	PIC1_CMD	0x20	//!< Adresa za naredbe glavnog PIC-a
#define	PIC2_CMD	0xA0	//!< Adresa za naredbe sporednog PIC-a
#define	PIC1_DATA	0x21	//!< Adresa za naredbe glavnog PIC-a
#define	PIC2_DATA	0xA1	//!< Adresa za naredbe sporednog PIC-a
#define	PIC_EOI		0x20	//!< EndOfInterrupt naredbe

#define	IRQ_OFFSET	0x20	//!< Kamo su pomaknuti interrupti

#ifndef _ARH_PREKIDI_S_

void i8259_omoguci_prekid (unsigned char irq);
void i8259_zabrani_prekid (unsigned char irq);

// sklopovski prekidi
enum {
	IRQ_TIMER = 0,
	IRQ_KEYBOARD,
	IRQ_SLAVE_PIC,
	IRQ_COM2,
	IRQ_COM1,
	IRQ_LPT2,
	IRQ_FLOPPY,
	IRQ_LPT1,
	IRQ_RT_CLOCK,
	IRQ_MASTER_PIC,
	IRQ_RESERVED1,
	IRQ_RESERVED2,
	IRQ_RESERVED3,
	IRQ_COPROCESSOR,
	IRQ_HARD_DISK,
	IRQ_RESERVED4,

	NUM_IRQS
};

#ifdef _ARH_PREKIDI_C_
//samo za "arh/prekidi.c"

static void i8259_inicijaliziraj(); //inicijaliziraj PIC

//i8259 (PIC) -----------------------------------------------------------------<

//IDT dio --------------------------------------------------------------------->
//! Izgled nekog opisnika prekida u IDT
typedef	struct {
	uint16	offset_lo;		//!< Offset (bits 0-15)
	uint16	seg_sel;		//!< Segment selector
	uint8	zero;			//!< Uvijek 0
	uint8	type		: 5;	//!< Tip
	uint8	dpl		: 2;	//!< Privilege level
	uint8	present		: 1;	//!< Present
	uint16	offset_hi;		//!< Offset (bits 16-31)
} __attribute__((__packed__)) idt_t;

//! Pokazivac na IDT - registar, prilagodjen za LIDT instrukciju
typedef	struct {
	uint16 limit;
	idt_t *base;
} __attribute__((__packed__)) idtr_t;

static void idt_inicijaliziraj ();

//IDT dio ---------------------------------------------------------------------<

#endif /* _ARH_PREKIDI_C_ */
#endif	/* !_ARH_PREKIDI_S_ */
#endif	/* _ARH_PREKIDI_H_ */
